/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import model.Cour;
import model.Examen;
import model.Note;
import model.Personne;

/**
 *
 * @author Paul
 */
public class DAOCour {

    public boolean create(String nomCour, float coeff) {
        boolean create = false;
        boolean recherche = false;
        String query = "INSERT INTO `cour`( `nom`, `coefficient`) VALUES (?,?)";//preparation de la requete
        recherche = findCreateCour(nomCour);
        if (recherche = true) {
            return false;
       }
        /**
         * initialisation des variables *
         */
        int nb = 0;
        int autoIncKeyFromApi = -1;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setString(1, nomCour);
            ps.setFloat(2, coeff);
            nb = ps.executeUpdate();//lancement de la requête
            ResultSet rs = ps.getGeneratedKeys();//recupération du résultat

            if (rs.next()) {//récuperation de l'id 
                autoIncKeyFromApi = rs.getInt(1);
                System.out.println(autoIncKeyFromApi);
            }
          if (nb >= 1) {
            create = true;
        }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return create;

    }
    
    public boolean findCreateCour(String nomCour) {
        String query = "SELECT c.nom FROM cour c WHERE c.nom = '"+nomCour+"'";
        int nb = 0;
        Statement ps = null;
        boolean del = false; 

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
            while (res.next()) {
                String nom = res.getString("nom");
            if (res.first()) {
                nb = nb + 1;
            }
           }
        }
  
         catch (SQLException e) {
            e.printStackTrace();
        }
        
         if (nb >= 1) {
            
               del = true;
            }
      return del;
    }
    

    public boolean deleteAttributeEudiant(int id_Etudiant, int id_Cour) {
        String query = "DELETE FROM etu_cour_asso WHERE id_eleve = ? AND id_cour = ?";//preparation de la requete
        /**
         * initialisation des variables *
         */
        int nb = 0;
        boolean del = false;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setInt(1, id_Etudiant);
            ps.setInt(2, id_Cour);
            nb = ps.executeUpdate();//lancement de la requête
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (nb >= 1) {
            del = true;
        }
        return del;

    }
    
    public void attributeEudiant(int id_Etudiant, int id_Cour) {
        String query = "insert into etu_cour_asso (id_eleve,id_cour) values (?,?)";//preparation de la requete
        /**
         * initialisation des variables *
         */
        int nb = 0;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setInt(1, id_Etudiant);
            ps.setInt(2, id_Cour);
            nb = ps.executeUpdate();//lancement de la requête
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    
    public boolean createCourExam (int idCour, int idExamen) {
        boolean del = false;
        String query = "INSERT INTO `cour_exam_asso`(`id_cour`, `id_examen`) VALUES (?,?)";//preparation de la requete
        /**
         * initialisation des variables *
         */
        int nb = 0;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setInt(1, idCour);
            ps.setInt(2, idExamen);
            nb = ps.executeUpdate();//lancement de la requête
            if (nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;
    }

    public boolean attributeProfesseur(int id_prof, int id_Cour) {
        String query = "insert into enseig_cour_asso (id_enseignant,id_cour) values (?,?)";//preparation de la requete
        boolean del = false;
        /**
         * initialisation des variables *
         */
        int nb = 0;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setInt(1, id_prof);
            ps.setInt(2, id_Cour);
            nb = ps.executeUpdate();//lancement de la requête
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;

    }
    
     public boolean deleteAttributeProfesseur(int id_prof, int id_Cour) {
        String query = "DELETE FROM enseig_cour_asso WHERE id_enseignant=? AND id_cour=?";//preparation de la requete
        boolean del = false;
        /**
         * initialisation des variables *
         */
        int nb = 0;
        PreparedStatement ps = null;

        /**
         * lancement de la connexion à la bd et de la requete *
         */
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete

            /**
             * remplacement des points d'interogation dans la query par les variables*
             */
            ps.setInt(1, id_prof);
            ps.setInt(2, id_Cour);
            nb = ps.executeUpdate();//lancement de la requête
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;

    }
     
     public Personne findProfCourEtu (Cour obj) {
         String query = "SELECT id_enseignant FROM enseig_cour_asso WHERE id_cour = "+obj.getIdCour()+" ";
         int nb = 0;
        int id_enseignant = 0;
        int id_personne = 0;
        boolean del = false;
        Statement  ps=null;
        Personne p = null;

       /**lancement de la connexion à la bd et de la requete **/
        try {
            Connection conn = DBConnection.getConnection();
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
        /** remplacement des points d'interogation dans la query par les variables**/  
           while (res.next()) {
               id_enseignant = res.getInt("id_enseignant");
           }
            String query2 = "SELECT id_personne  FROM enseignant WHERE id_enseignant = "+id_enseignant+" ";
            ps = conn.createStatement();
            ResultSet res2 = ps.executeQuery(query2);
             while (res2.next()) {
               id_personne = res.getInt("id_personne");
           }
             String query3 = "SELECT nom, prenom  FROM personne WHERE id_personne = "+id_personne+" ";
            ps = conn.createStatement();
            ResultSet res3 = ps.executeQuery(query3);
             while (res2.next()) {
               String nom = res.getString("nom");
               String prenom = res.getString("prenom");
               p = new Personne(prenom, nom);
           }
            if(nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return p;
     }

        

//Trouver les cour associé a un etudiant
    public ArrayList<Cour> findCours(int id_etudiant) {
        String query = "SELECT c.id_cour, c.nom,c.coefficient FROM cour c, etu_cour_asso e WHERE e.id_cour = c.id_cour AND e.id_eleve =" + id_etudiant + ";";
        ArrayList<Cour> cours = new ArrayList<Cour>();
        Cour cour = null;
        Statement ps = null;
        try {
            Connection conn = DBConnection.getConnection();
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
            while (res.next()) {
                int id = res.getInt("id_cour");
                String nom = res.getString("nom");
                float coef = res.getFloat("coefficient");
                cour = new Cour(id, nom,coef);
                cours.add(cour);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return cours;
    }
    
    public ArrayList<Cour> findCoursProf(int id_prof) {
        String query = "SELECT c.id_cour, c.nom,c.coefficient FROM cour c, enseig_cour_asso e WHERE e.id_cour = c.id_cour AND e.id_enseignant =" + id_prof + ";";
        ArrayList<Cour> cours = new ArrayList<Cour>();
        Cour cour = null;
        Statement ps = null;
        try {
            Connection conn = DBConnection.getConnection();
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query);
            while (res.next()) {
                int id = res.getInt("id_cour");
                String nom = res.getString("nom");
                float coef = res.getFloat("coefficient");
                cour = new Cour(id, nom,coef);
                cours.add(cour);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return cours;
    }
    public boolean update(Cour obj) {
        String query = "UPDATE `cour` SET `id_cour`= ?,`nom`= ?,`coefficient`= ? WHERE `id_cour` = ?";
        int nb = 0;
        boolean del = false;
        PreparedStatement  ps=null;

       /**lancement de la connexion à la bd et de la requete **/
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps= conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            
        /** remplacement des points d'interogation dans la query par les variables**/  
            ps.setInt(1,obj.getIdCour());
            ps.setString(2,obj.getNomCour());
            ps.setFloat(3, obj.getCoefCour());
            ps.setInt(4, obj.getIdCour());
            nb = ps.executeUpdate();//lancement de la requête
            if(nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;
    }

  

    public boolean delete(int idCour) {
        String query = "DELETE FROM `cour` WHERE `id_cour` = "+idCour+" ?";
         int nb = 0; 
        boolean del = false;
        PreparedStatement  ps=null;

       /**lancement de la connexion à la bd et de la requete **/
        try {
            Connection conn = DBConnection.getConnection();//Creation de la connexion
            ps= conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);//preparation de la requete
            nb = ps.executeUpdate();//lancement de la requête
            if(nb >= 1) {
                del = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return del;
    }

    public ArrayList<Cour> getAll() {
        String query = "";
        return findGeneral(query);
    }

    public Cour find(int id) {
        String query = "select * from cour where id_cour=" + id + ";";
        Cour cour = null;
        if (findGeneral(query).size() != 0) {
            cour = findGeneral(query).get(0);
        }
        return cour;
    }
    
    public ArrayList<Cour> findCoeff(int idEleve) {
        int id_pers = 0;
        String query1 = "SELECT DISTINCT et.id_personne FROM personne p, etudiant et WHERE id_eleve = "+idEleve+" ";
         ArrayList<Cour> cours = new ArrayList<Cour>();
        Cour cour = null;
        Statement ps = null;
        try {
            Connection conn = DBConnection.getConnection();
            ps = conn.createStatement();
            ResultSet res = ps.executeQuery(query1);
            while (res.next()) {
                id_pers = res.getInt("id_personne");
            }
            String query = "SELECT c.id_cour, c.nom, c.coefficient FROM etu_cour_asso cea, cour c, personne p WHERE c.id_cour = cea.id_cour AND cea.id_eleve = "+idEleve+" AND p.id_personne ="+ id_pers+"";
            ps = conn.createStatement();
            ResultSet res2 = ps.executeQuery(query);
            while (res2.next()) {
                int id = res2.getInt("id_cour");
                String nom = res2.getString("nom");
                float coeff = res2.getFloat("coefficient");
                cour = new Cour(id, nom,coeff);
                cours.add(cour);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return cours;
    }
    
       public HashMap<String,Float> getAllNoteExamFromCour(int id_etudiant, int id_cour){
  HashMap<String,Float> map = new HashMap<String, Float>();

        ArrayList<Examen> exams=new ArrayList<Examen>();
        
        DAOExamen daoex= new DAOExamen();
        exams=daoex.getAllExamFromCour(id_cour);
        
        for(Examen exam : exams){
            DAONote daonote=new DAONote();
            Note n = daonote.findNoteEtudiantExam(id_etudiant,exam.getId());
            map.put(exam.getNomExamen(), n.getNote());
        }
        
        
        for (Map.Entry<String,Float> entry : map.entrySet()) {
    System.out.println(entry.getKey().toString()+" " +entry.getValue().toString());
}
    return map;
    }

//---------------------------------------------------------private method--------------------------------------------------------------------//


    private ArrayList<Cour> findGeneral(String requete) {
        ArrayList<Cour> cours = new ArrayList<Cour>();
        Statement st = null;
        Cour cour = null;
        try {
            Connection conn = DBConnection.getConnection();
            st = conn.createStatement();
            ResultSet res = st.executeQuery(requete);
            while (res.next()) {
                cour = createObject(res);
                cours.add(cour);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return cours;
    }

    private Cour createObject(ResultSet res) {
        Cour cour = null;
        try {
            int id = res.getInt("id_cour");
            String nom = res.getString("nom");
            cour = new Cour(id, nom);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return cour;
    }
 
}
